home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Source / MacTech® Magazine / Volume 09 - 1993 / 09.02 Feb 93 / Getting Started / MenuMaster.c next >
Encoding:
C/C++ Source or Header  |  1993-01-22  |  4.8 KB  |  270 lines  |  [TEXT/KAHL]

  1. #include <Values.h>
  2.  
  3. #define kBaseResID            128
  4. #define    kMoveToFront        (WindowPtr)-1L
  5. #define kSleep                    MAXLONG
  6.  
  7. #define kLastMenu            0
  8.  
  9. #define mApple                    kBaseResID
  10. #define iAbout                    1
  11.  
  12. #define mFile                    kBaseResID+1
  13. #define iQuit                    1
  14.  
  15. #define mOptions                kBaseResID+3
  16. #define iChangeName        1
  17. #define iDisableMe            3
  18. #define iEnablePrev        4
  19. #define iAddExtraMenu    6
  20. #define iAppendItem        8
  21. #define iAddedItem            9
  22.  
  23. #define kUnchangedName        "\pChange My Name"
  24. #define kChangedName            "\pChange Me Back Again"
  25.  
  26. #define mExtraMenu            kBaseResID+4
  27. #define iDeleteMenu        1
  28.  
  29.  
  30. /*************/
  31. /*  Globals  */
  32. /*************/
  33.  
  34. Boolean        gDone;
  35. Boolean        gItemNameChanged = false;
  36.  
  37.  
  38. /***************/
  39. /*  Functions  */
  40. /***************/
  41.  
  42. void    ToolBoxInit( void );
  43. void    WindowInit( void );
  44. void    MenuBarInit( void );
  45. void    EventLoop( void );
  46. void    DoEvent( EventRecord *eventPtr );
  47. void    HandleMouseDown( EventRecord *eventPtr );
  48. void    HandleMenuChoice( long menuChoice );
  49. void    HandleAppleChoice( short item );
  50. void    HandleFileChoice( short item );
  51. void    HandleOptionsChoice( short item );
  52. void    HandleExtraMenuChoice( short item );
  53.  
  54. /*************************** main *********/
  55.  
  56. void    main( void )
  57. {
  58.     ToolBoxInit();
  59.     MenuBarInit();
  60.     
  61.     EventLoop();
  62. }
  63.  
  64. /*************************** ToolBoxInit */
  65.  
  66. void    ToolBoxInit( void )
  67. {
  68.     InitGraf( &thePort );
  69.     InitFonts();
  70.     InitWindows();
  71.     InitMenus();
  72.     TEInit();
  73.     InitDialogs( nil );
  74.     InitCursor();
  75. }
  76.  
  77. /****************** MenuBarInit ************/
  78.  
  79. void    MenuBarInit( void )
  80. {
  81.     Handle                menuBar;
  82.     MenuHandle        menu;
  83.     
  84.     menuBar = GetNewMBar( kBaseResID );
  85.     SetMenuBar( menuBar );
  86.  
  87.     menu = GetMHandle( mApple );
  88.     AddResMenu( menu, 'DRVR' );
  89.     
  90.     DrawMenuBar();
  91. }
  92.  
  93. /************************* EventLoop *********/
  94.  
  95. void    EventLoop( void )
  96. {        
  97.     EventRecord        event;
  98.     
  99.     gDone = false;
  100.     while ( gDone == false )
  101.     {
  102.         if ( WaitNextEvent( everyEvent, &event, kSleep, nil ) )
  103.             DoEvent( &event );
  104.     }
  105. }
  106.  
  107. /************************** DoEvent     */
  108.  
  109. void    DoEvent( EventRecord *eventPtr )
  110. {
  111.     char        theChar;
  112.     
  113.     switch ( eventPtr->what )
  114.     {
  115.         case mouseDown: 
  116.             HandleMouseDown( eventPtr );
  117.             break;
  118.         case keyDown:
  119.         case autoKey:
  120.             theChar = eventPtr->message & charCodeMask;
  121.             if ( (eventPtr->modifiers & cmdKey) != 0 ) 
  122.                 HandleMenuChoice( MenuKey( theChar ) );
  123.             break;
  124.     }
  125. }
  126.  
  127. /********************* HandleMouseDown */
  128.  
  129. void    HandleMouseDown( EventRecord *eventPtr )
  130. {
  131.     WindowPtr        window;
  132.     short                thePart;
  133.     long                    menuChoice;
  134.     
  135.     thePart = FindWindow( eventPtr->where, &window );
  136.     
  137.     switch ( thePart )
  138.     {
  139.         case inMenuBar:
  140.             menuChoice = MenuSelect( eventPtr->where );
  141.             HandleMenuChoice( menuChoice );
  142.             break;
  143.         case inSysWindow : 
  144.             SystemClick( eventPtr, window );
  145.             break;
  146.     }
  147. }
  148.  
  149. /****************** HandleMenuChoice *********/
  150.  
  151. void    HandleMenuChoice( long menuChoice )
  152. {
  153.     short        menu;
  154.     short        item;
  155.     
  156.     if ( menuChoice != 0 )
  157.     {
  158.         menu = HiWord( menuChoice );
  159.         item = LoWord( menuChoice );
  160.         
  161.         switch ( menu )
  162.         {
  163.             case mApple:
  164.                 HandleAppleChoice( item );
  165.                 break;
  166.             case mFile:
  167.                 HandleFileChoice( item );
  168.                 break;
  169.             case mOptions:
  170.                 HandleOptionsChoice( item );
  171.                 break;
  172.             case mExtraMenu:
  173.                 HandleExtraMenuChoice( item );
  174.                 break;
  175.         }
  176.         HiliteMenu( 0 );
  177.     }
  178. }
  179.  
  180. /****************** HandleAppleChoice ************/
  181.  
  182. void    HandleAppleChoice( short item )
  183. {
  184.     MenuHandle    appleMenu;
  185.     Str255            accName;
  186.     short            accNumber;
  187.     
  188.     switch ( item )
  189.     {
  190.         case iAbout:
  191.             SysBeep( 20 );
  192.             break;
  193.         default:
  194.             appleMenu = GetMHandle( mApple );
  195.             GetItem( appleMenu, item, accName );
  196.             accNumber = OpenDeskAcc( accName );
  197.             break;
  198.     }
  199. }
  200.  
  201. /***************** HandleFileChoice ************/
  202.  
  203. void    HandleFileChoice( short item )
  204. {
  205.     switch ( item )
  206.     {
  207.         case iQuit :
  208.             gDone = true;
  209.             break;
  210.     }
  211. }
  212.  
  213. /****************** HandleOptionsChoice ***************/
  214.  
  215. void    HandleOptionsChoice( short item )
  216. {
  217.     MenuHandle    menu;
  218.     
  219.     menu = GetMHandle( mOptions );
  220.     
  221.     switch ( item )
  222.     {
  223.         case iChangeName:
  224.             if ( gItemNameChanged )
  225.                 SetItem( menu, iChangeName, kUnchangedName );
  226.             else
  227.                 SetItem( menu, iChangeName, kChangedName );
  228.             gItemNameChanged = ! gItemNameChanged;
  229.             break;
  230.         case iDisableMe:
  231.             DisableItem( menu, iDisableMe );
  232.             EnableItem( menu, iEnablePrev );
  233.             break;
  234.         case iEnablePrev:
  235.             DisableItem( menu, iEnablePrev );
  236.             EnableItem( menu, iDisableMe );
  237.             break;
  238.         case iAddExtraMenu:
  239.             DisableItem( menu, iAddExtraMenu );
  240.             menu = GetMenu( mExtraMenu );
  241.             InsertMenu( menu, kLastMenu );
  242.             DrawMenuBar();
  243.             break;
  244.         case iAppendItem:
  245.             AppendMenu( menu, "\pCan't Delete Me..." );
  246.             DisableItem( menu, iAppendItem );
  247.             break;
  248.         case iAddedItem:
  249.             SysBeep( 20 );
  250.             break;
  251.     }
  252. }
  253.  
  254. /****************** HandleExtraMenuChoice *************/
  255.  
  256. void    HandleExtraMenuChoice( short item )
  257. {
  258.     MenuHandle    menu;
  259.     
  260.     switch ( item )
  261.     {
  262.         case iDeleteMenu:
  263.             menu = GetMHandle( mOptions );
  264.             EnableItem( menu, iAddExtraMenu );
  265.             
  266.             DeleteMenu( mExtraMenu );
  267.             DrawMenuBar();
  268.             break;
  269.     }
  270. }